/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年8月8日
 * 项目： rainhy-servicelogger
 */
package com.rainhy.servicelogger.context;

import java.util.List;

import org.springframework.beans.factory.InitializingBean;

import com.rainhy.core.util.AssertUtils;
import com.rainhy.servicelogger.logger.ServiceLogger;

/**
 * 业务日志容器
 * 
 * @author rain
 * @version [版本号, 2016年8月8日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class ServiceLoggerContext extends ServiceLoggerContextBuilderFactory implements InitializingBean {
    
    /** 自身引用 */
    private static ServiceLoggerContext context;
    
    /** 返回自身引用 */
    public static ServiceLoggerContext getContext() {
        return ServiceLoggerContext.context;
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        ServiceLoggerContext.context = this;
        super.afterPropertiesSet();
        logger.debug("[业务日志容器]: 启动完成...");
    }
    
    /** 根据主键查询业务日志 */
    @SuppressWarnings("unchecked")
    public <T> T find(Class<T> cla, String id) {
        AssertUtils.notEmpty(id, "业务日志主键不能为 null");
        List<ServiceLogger> serviceLoggers = ServiceLoggerContext.context.getServiceLoggers(cla);
        for (ServiceLogger serviceLogger : serviceLoggers) {
            if (serviceLogger.isSupportQuery()) {
                return (T) serviceLogger.find(id);
            }
        }
        return null;
    }
    
    /** 记录业务日志 */
    public void log(Object log) {
        AssertUtils.notNull(log, "业务日志不能为 null");
        List<ServiceLogger> serviceLoggers = ServiceLoggerContext.context.getServiceLoggers(log.getClass());
        for (ServiceLogger serviceLogger : serviceLoggers) {
            serviceLogger.log(log);
        }
    }
    
    /** 记录业务日志 */
    public static void logger(Object log) {
        ServiceLoggerContext.getContext().log(log);
    }
}
